/**
 * @Author: LAMMU
 * @FilePath: /nuxt3-template/Users/lammu/Desktop/workplace-vite/template/vite.config.js
 * @Date: 2023-05-14 22:34:56
 * @LastEditors: LAMMU
 * @LastEditTime: 2023-05-15 00:12:00
 * @Description: 请添加文件描述
 */
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import viteCompression from 'vite-plugin-compression';
import externalGlobals from 'rollup-plugin-external-globals';

/** 是否是打包 */
const isBuild = process.argv.includes('build');

// https://vitejs.dev/config/
export default defineConfig({
  base: "/microappA/",
  plugins: [
    ...(isBuild ? [
      /**
       * 注入部署信息，部署后可通过window.deploy_info获取
       */
      {
        name: 'html-transform',
        transformIndexHtml(html) {
          return html
            // .replace('<!-- inject_on_build：vue -->', `<script src="/admin/_vue.3.2.47.runtime.global.prod.js"></script>`)
            // .replace('<!-- inject_on_build：vue-router -->', `<script src="/admin/_vue-router.4.1.6.global.prod.js"></script>`)
            // .replace('<!-- inject_on_build：micro-app -->', `<script src="/admin/_micro-app.1.0.0.rc.5.min.js"></script>`)
        }
      },
    ]: []),
    vue({
      template: {
        compilerOptions: {
          // 将wc-前缀的标签名都视为自定义元素
          isCustomElement: (tag) => tag.startsWith('wc-') || tag.startsWith('micro-app')
        }
      }
    }),
    viteCompression({
      algorithm: 'gzip', /** 压缩算法 */
      ext: '.gz', /** 生成的文件后缀 */
      threshold: 1024*20, /** 对超过10k的数据压缩 */
      verbose: false, /** 禁止在控制台输出压缩结果 */
      filter: /\.(js|mjs|json|css|html)$/i, /** 对这些文件进行压缩 */
      deleteOriginFile: false /** 是否删除原文件 */
    })
  ],
  server: {
    port: 2333,
    host: "0.0.0.0",
    headers: {
      "Access-Control-Allow-Origin": "*",
    },
    /** 代理到父应用, 本地可以使用yarn preview查看子应用独立运行情况 */
    proxy: {
      '/admin': {
        target: 'http://localhost:2666',
      }
    },
  },
  headers: {
    "Access-Control-Allow-Origin": "*",
  },
  resolve: {
    alias: { /** cdn位置 或 相对当前文件的位置 （本地运行时生效，打包external时不会替换关键词！！！） */
      // 'vue': 'https://cdn.bootcdn.net/ajax/libs/vue/3.2.41/vue.esm-browser.prod.min.js',
      // 'vue-router': 'https://cdn.bootcdn.net/ajax/libs/vue-router/4.1.6/vue-router.esm-browser.min.js',
    },
    extensions: ['.js', '.vue', '.css'],
  },
  build: {
    /** 配置资源打包目录 */
    assetsDir: './js',
    /** 分包后警告大小（未压缩大小） */
    chunkSizeWarningLimit: 1000,
    /** css不抽离为单独文件 */
    cssCodeSplit: false,
    rollupOptions: {
      plugins: [
        // /** 不打包这些依赖 */
        // externalGlobals({
        //   'vue': 'Vue',
        //   'vue-router': 'VueRouter',
        //   'element-plus': 'ElementPlus',
        //   '@micro-zoe/micro-app': 'microApp',
        // }),
      ],
      /** 打包排除这些依赖，保持import { xxx } from 'vue';这种导入 */
      external: ['vue', 'vue-router', 'element-plus', '@micro-zoe/micro-app'],
      output: {
        // manualChunks: {
        //   'micro-app': ['@micro-zoe/micro-app'],
        //   'vue': ['vue'],
        //   'vue-router': ['vue-router'],
        //   // 'element-plus': ['element-plus']
        // },
        format: 'esm', // 打包模式
        /**
         * 从对应网络路径中加载依赖
         * 对于external排除的依赖，直接从'vue'导入是无效的路径，所以需要配置对应资源路径
         */
        paths: {
          'vue': '/admin/vue.esm-browser.js',
          'vue-router': '/admin/vue-router.esm-browser.js',
          '@micro-zoe/micro-app': '/admin/micro-app.1.0.0.rc.5.esm.js',
          'element-plus': '/admin/element-plus.2.2.20.full.mjs.js',
        },
        /** 入口文件输出格式 */
        entryFileNames: 'js/[name].[hash]_h.js',
        /** js文件输出格式 */
        chunkFileNames: 'js/[name].[hash]_h.js',
        /** 资源文件输出格式 */
        assetFileNames: (assetInfo) => {
          /** 默认输出格式 */
          const defaultFormat = '[ext]/[name].[hash]_h.[ext]';
          /** 图片后缀 */
          const imageExts = ['png', 'jpg', 'jpeg', 'webp', 'gif', 'svg', 'ico'];
          /** 字体后缀 */
          const fontExts = ['ttf', 'woff', 'woff2'];
          /** 当前文件后缀 */
          const fileExt = assetInfo.name?.split('.').slice(-1)[0];
          /** 提取文件后缀异常处理 */
          if (!fileExt) {
            console.warn('>>> 文件后缀异常: ', assetInfo);
            return defaultFormat;
          }
          /** 图片资源 */
          if (imageExts.includes(fileExt)) {
            return 'img/[name].[hash]_h.[ext]';
          } else if (fontExts.includes(fileExt)) {
            return 'font/[name].[hash]_h.[ext]';
          }
          /** 其它资源 */
          return defaultFormat;
        },
      }
    }
  },
});
